package com.im;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

// 用户列表视图
public class UserListView extends GridView implements AdapterView.OnItemClickListener {
    // 风格
    public enum Style {
        ICON("ICON"),                       // 图标
        ICON_TEXT("ICON_TEXT"),             // 上面显示图标，下面显示文字
        ICON_TEXT_LIST("ICON_TEXT_LIST"),   // 左边显示图标，右边显示文字
        TEXT("TEXT");                       // 文字

        /**
         * 构造方法。
         * @param name  名字
         */
        Style(String name) {
        }
    }

    // 适配器
    private final BaseAdapter mAdapter = new BaseAdapter() {
        /**
         * 获取 item 数量。
         * @return item 数量
         */
        @Override
        public int getCount() {
            int count = 0;
            if (mStyle == Style.TEXT) {
                if (!mTextList.isEmpty()) {
                    count = mTextList.size();
                }
            } else {
                if (!mNormalIconList.isEmpty()) {
                    count = mNormalIconList.size();
                }
            }
            return count;
        }

        /**
         * 获取 item。
         * @param position  位置
         * @return item
         */
        @Override
        public Object getItem(int position) {
            if (!mTextList.isEmpty()) {
                return mTextList.get(position);
            }
            if (!mNormalIconList.isEmpty()) {
                return mNormalIconList.get(position);
            }
            return null;
        }

        /**
         * 获取 item id。
         * @param position  位置
         * @return item id
         */
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         * 获取视图。
         * @param position      位置
         * @param convertView   视图
         * @param viewGroup     视图组
         * @return 视图
         */
        @Override
        public View getView(int position, View convertView, ViewGroup viewGroup) {
            if (position < mViewList.size()) {
                return mViewList.get(position);
            }

            Bitmap image;
            final Context context = UserListView.super.getContext();
            switch (mStyle) {
                case ICON:
                    // 创建图片视图
                    final ImageView imageView = new ImageView(context);
                    mViewList.add(imageView);

                    // 设置图片
                    image = mNormalIconList.get(position);
                    imageView.setImageBitmap(image);
                    return imageView;
                case ICON_TEXT:
                case TEXT:
                    break;
                case ICON_TEXT_LIST:
                    // 创建文字视图
                    final TextView textView = new TextView(context);
                    mViewList.add(textView);
                    textView.setBackgroundColor(Const.USER_LIST_VIEW_ITEM_COLOR);
                    textView.setGravity(Gravity.CENTER_VERTICAL);
                    textView.setCompoundDrawablePadding(Const.USER_LIST_VIEW_ITEM_PADDING);

                    // 设置文字
                    final String text = mTextList.get(position);
                    textView.setText(text);

                    // 设置图片
                    final boolean colorful = mColorfulList.get(position);
                    UserListView.this.setItemImage(textView, position, colorful);
                    return textView;
            }
            return null;
        }
    };

    private final List<Boolean> mColorfulList;  // 彩色标志列表
    private final List<Bitmap> mGrayIconList;   // 灰色图标列表
    private final List<Bitmap> mNormalIconList; // 正常图标列表
    private int mSelectedItemIndex;             // 当前选中的表项的索引
    private Style mStyle;                       // 风格
    private final List<String> mTextList;       // 文字列表
    private final List<View> mViewList;         // 视图列表

    /**
     * 构造方法。
     * @param context   设备环境
     * @param style     风格
     */
    public UserListView(Context context, Style style) {
        super(context);
        mColorfulList = new ArrayList<>();
        mGrayIconList = new ArrayList<>();
        mViewList = new ArrayList<>();
        mNormalIconList = new ArrayList<>();
        mSelectedItemIndex = -1;
        mTextList = new ArrayList<>();
        mSelectedItemIndex = -1;
        mStyle = style;
        this.init();
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集合
     */
    public UserListView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
        mColorfulList = new ArrayList<>();
        mGrayIconList = new ArrayList<>();
        mNormalIconList = new ArrayList<>();
        mSelectedItemIndex = -1;
        final String style = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "style");
        mStyle = Style.valueOf(style);
        mTextList = new ArrayList<>();
        mViewList = new ArrayList<>();
        this.init();
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集合
     * @param defStyle  默认属性
     */
    public UserListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mColorfulList = new ArrayList<>();
        mGrayIconList = new ArrayList<>();
        mNormalIconList = new ArrayList<>();
        mSelectedItemIndex = -1;
        mTextList = new ArrayList<>();
        mViewList = new ArrayList<>();
        this.init();
    }

    /**
     * 添加一个表项。
     * @param iconIndex 图标索引
     */
    public void addItem(int iconIndex) {
        // 添加表项
        final Bitmap icon = BitmapFactory.decodeResource(super.getResources(), iconIndex + R.mipmap.normal00);
        mNormalIconList.add(icon);

        // 设置列宽
        super.setColumnWidth(icon.getWidth());

        // 刷新
        mAdapter.notifyDataSetChanged();
    }

    /**
     * 添加一个表项。
     * @param itemText  表项文字
     * @param iconIndex 图标索引
     * @param colorful  彩色则为 true，灰色则为 false
     */
    public void addItem(String itemText, int iconIndex, boolean colorful) {
        // 添加正常图标
        final Bitmap normalIcon = BitmapFactory.decodeResource(super.getResources(), iconIndex + R.mipmap.normal00);
        mNormalIconList.add(normalIcon);

        // 添加灰色图标
        final Bitmap grayIcon = this.toGrayImage(normalIcon);
        mGrayIconList.add(grayIcon);

        // 添加颜色标志
        mColorfulList.add(colorful);

        // 添加文字
        mTextList.add(itemText);

        // 刷新
        mAdapter.notifyDataSetChanged();
    }

    /**
     * 改变某个表项的图标颜色。
     * @param itemText  表项的文字
     * @param colorful  彩色则为 true，灰色则为 false
     */
    public void changeItemColor(String itemText, boolean colorful) {
        // 查找表项
        final int itemIndex = mTextList.indexOf(itemText);
        if (itemIndex == -1) {
            return;
        }

        // 设置图标颜色
        mColorfulList.set(itemIndex, colorful);
        final TextView textView = (TextView)mViewList.get(itemIndex);
        this.setItemImage(textView, itemIndex, colorful);
        mAdapter.notifyDataSetChanged();
    }

    /**
     * 清除所有表项。
     */
    public void clear() {
        mColorfulList.clear();
        mGrayIconList.clear();
        mNormalIconList.clear();
        mTextList.clear();
        mAdapter.notifyDataSetChanged();
    }

    /**
     * 获取表项上的文字。
     * @param itemIndex 表项索引
     * @return 表项上的文字
     */
    public String getItemText(int itemIndex) {
        return mTextList.get(itemIndex);
    }

    /**
     * 获取选中的表项的索引。
     * @return 选中的表项的索引
     */
    @Override
    public int getSelectedItemPosition() {
        return mSelectedItemIndex;
    }

    /**
     * 初始化。
     */
    private void init() {
        // 设置内容适配器
        super.setAdapter(mAdapter);

        // 设置 item 单击事件监听者
        super.setOnItemClickListener(this);
    }

    /**
     * 表项单击事件的响应方法。
     * @param adapterView   适配器视图
     * @param view          视图
     * @param position      位置
     * @param l             无用
     */
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        // 如果不是图标风格则直接返回
        if (mStyle != Style.ICON) {
            mSelectedItemIndex = position;
            return;
        }

        // 取消上一个图标的选中状态
        ImageView imageView;
        if (mSelectedItemIndex != -1) {
            imageView = (ImageView)mViewList.get(mSelectedItemIndex);
            imageView.clearColorFilter();
        }

        // 设置当前图标的选中状态
        imageView = (ImageView)mViewList.get(position);
        imageView.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);

        // 设置选中的图标索引
        mSelectedItemIndex = position;
    }

    /**
     * 设置表项的图标。
     * @param textView  文本视图
     * @param itemIndex 表项索引
     * @param colorful  彩色则为 true，灰色则为 false
     */
    private void setItemImage(TextView textView, int itemIndex, boolean colorful) {
        final Bitmap image = colorful ? mNormalIconList.get(itemIndex): mGrayIconList.get(itemIndex);
        final BitmapDrawable bitmapDrawable = new BitmapDrawable(textView.getResources(), image);
        textView.setCompoundDrawablesWithIntrinsicBounds(bitmapDrawable, null, null, null);
    }

    /**
     * 将彩色图片转换为灰色图片。
     * @param image 图片
     * @return 转换后的图片
     */
    private Bitmap toGrayImage(Bitmap image) {
        // 获取图片的尺寸
        final int width = image.getWidth();
        final int height = image.getHeight();

        // 通过位图的大小创建像素点数组
        final int[] pixels = new int[width * height];
        image.getPixels(pixels, 0, width, 0, 0, width, height);

        // 通过位移运算得到灰色图片的像素数据
        final int alpha = 0xFF << 24;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int gray = pixels[width * i + j];
                final int red = (gray & 0x00FF0000) >> 16;
                final int green = (gray & 0x0000FF00) >> 8;
                final int blue = gray & 0x000000FF;
                gray = (int)(red * 0.3 + green * 0.59 + blue * 0.11f);
                gray = alpha | (gray << 16) | (gray << 8) | gray;
                pixels[width * i + j] = gray;
            }
        }

        // 创建灰色图片
        final Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        // 设置灰色图片的像素数据
        result.setPixels(pixels, 0, width, 0, 0, width, height);
        return result;
    }
}
